#ifndef IDT_H
#define IDT_H

#include <stdint.h>
#include <regs.h>

#define IDT_ENTRIES 256

/******************************************
 *  0-15 | Offset 0-15
 * 16-31 | Selector (selects code segment)
 * 32-34 | 
 ******************************************/
struct idt_entry
{
	uint16_t base_lo;
	uint16_t sel;
	uint8_t always0;
	uint8_t flags;
	uint16_t base_hi;
} __attribute__((packed));

struct idt_ptr
{
	uint16_t limit;
	unsigned int base;
} __attribute__((packed));

typedef void(*intHandler)(registers_t *);

struct idt_entry idt[IDT_ENTRIES];
struct idt_ptr idtp;
intHandler interrupt_handlers[256];

void generalIntHandler(registers_t *);//TODO
void setIdtEntry(uint8_t, unsigned long, uint16_t, uint8_t);
void register_interrupt_handler(uint16_t, intHandler);
void generateIdt();
void remapIrq();

//ASM routines
extern void idt_load();
// interrupt handler routines
extern void isr0 ();
extern void isr1 ();
extern void isr2 ();
extern void isr3 ();
extern void isr4 ();
extern void isr5 ();
extern void isr6 ();
extern void isr7 ();
extern void isr8 ();
extern void isr9 ();
extern void isr10();
extern void isr11();
extern void isr12();
extern void isr13();
extern void isr14();
extern void isr15();
extern void isr16();
extern void isr17();
extern void isr18();
extern void isr19();
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();

extern void irq0 ();
extern void irq1 ();
extern void irq2 ();
extern void irq3 ();
extern void irq4 ();
extern void irq5 ();
extern void irq6 ();
extern void irq7 ();
extern void irq8 ();
extern void irq9 ();
extern void irq10();
extern void irq11();
extern void irq12();
extern void irq13();
extern void irq14();
extern void irq15();

#define IRQ0 32
#define IRQ1 33
#define IRQ2 34
#define IRQ3 35
#define IRQ4 36
#define IRQ5 37
#define IRQ6 38
#define IRQ7 39
#define IRQ8 40
#define IRQ9 41
#define IRQ10 42
#define IRQ11 43
#define IRQ12 44
#define IRQ13 45
#define IRQ14 46
#define IRQ15 47

extern void kernelException();

#include <stdio.h>
#include <memory.h>

#endif